#pragma once
#include <asm-generic/errno.h>
#include <cstddef>
#include <cstdlib>
#include<iostream>
#include <iterator>
#include <string>
#include<string.h>
#include <sys/socket.h>

namespace ns_protocol
{
#define SPACE " "
#define SPACE_LEN strlen(SPACE)
#define SEP "\r\n"
#define SEP_LEN strlen(SEP)

    class Request
    {
    public:
        std::string Serialize()
        {
            //序列化是将数据变为字符串
            std::string str;
            return str;
        }
        bool Deserialize(const std::string& str)
        {
            return false;
        }
    public:
        Request(){}
        Request(int x,int y,char op)
        :_x(x),_y(y),_op(op)
        {

        }
        ~Request(){

        }
        int _x;
        int _y;
        char _op;
    };

    class Response
    {
    public:
        std::string Serialize()
        {
            std::string str;
            return str;
        }
        bool Deserialize(const std::string& str)
        {
            return true;
        }
    public:
        Response(){}
        Response(int x,int y,char op,int result,int code)
        :_x(x),_y(y),_op(op)
        ,_result(result),_code(code)
        {

        }
        ~Response(){

        }
        int _x;
        int _y;
        char _op;
        int _code;
        int _result;
    };
    bool Recv(int sock,std::string* out)
    {
        char buffer[1024];
        ssize_t s=recv(sock, buffer, sizeof(buffer), 0);
        if(s > 0){
            buffer[s]=0;
            *out+=buffer;
        }
        else{
            return false;
        }
    }
    // bool Recv(int sock,std::string* out)
    // {
    //     char buffer[1024];
    //     ssize_t s=recv(sock, buffer, sizeof(buffer), 0);
    //     if(s > 0){
    //         buffer[s]=0;
    //         *out+=buffer;
    //     }
    //     else if(s == 0){
    //         return false;
    //     }
    //     else{
    //         return false;
    //     }
    //     return true;
    // }
    void Send(int sock,const std::string str)
    {
        //既然是要发送消息那么就必须先写明要发送的消息
        int n=send(sock, str.c_str(), sizeof(str), 0);
        if(n < 0)
        {
            std::cout<<"Send error"<<std::endl;
        }

    }
    //按照规定你必须给我返回一个完整的报文
    // bool Recv(int sock,std::string* out)
    // {
    //     char buffer[1024];
    //     ssize_t s=recv(sock, buffer, sizeof(buffer)-1, 0);
    //     if(s > 0)
    //     {
    //         buffer[s]=0;
    //         *out+=buffer;
    //     }
    //     else if(s == 0){
    //         return false;
    //     }
    //     return true;
    // }
    // void Send(int sock,const std::string str)
    // {
    //     int n=send(sock, str.c_str(), str.size(), 0);
    //     if(n < 0){
    //         std::cout<<"send error"<<std::endl;
    //     }
    // }
    //通过这样的方式来实现一个完整的报文
    // std::string EnCode(std::string& s)
    // {
    //     std::string new_package=std::to_string(s.size());
    //     new_package+=SEP;
    //     new_package+=s;
    //     new_package+=SEP;
    //     return new_package;
    // }
    std::string EnCode2(std::string s)
    {
        std::string new_package=std::to_string(s.size());
        new_package+=SEP;
        new_package+=s;
        new_package+=SEP;
        return new_package;
    }
    std::string EnCode(std::string s)
    {
        std::string new_package=std::to_string(s.size());
        new_package+=SEP;
        new_package+=s;
        new_package+=SEP;
        return new_package;
    }
    // std::string EnCode2(std::string& s)
    // {
    //     std::string new_package=std::to_string(s.size());
    //     new_package+=SEP;
    //     new_package+=s;
    //     new_package+=SEP;
    //     return new_package;
    // }
    std::string DeCode(const std::string& buffer)
    {
        std::size_t pos=buffer.find(SEP);
        if(pos == std::string::npos){
            return "";
        }
        int size=atoi(buffer.substr(0,pos).c_str());
        int surplus=buffer.size()-2*SEP_LEN-pos;
        if(surplus >= size){
            buffer.erase(0,pos);
            std::string s=buffer.substr(0,size);
            return s;
        }else{
            //返回一个空字符串即可
            return "";
        }
    }
    // std::string DeCode(const std::string& buffer)
    // {
    //     std::size_t pos=buffer.find(SEP);    
    //     if(pos==std::string::npos){
    //         return "";
    //     }
    //     int size=atoi(buffer.substr(0,pos).c_str());
    //     int surplus=buffer.size()-SEP_LEN*2-pos;
    //     if(surplus >= size){
    //         buffer.erase(0,pos);
    //         std::string s=buffer.substr(0,size);
    //         return s;
    //     }
    //     else{
    //         return "";
    //     }
    // }
    // std::string DeCode(const std::string& buffer)
    // {
    //     std::size_t pos=buffer.find(SEP);
    //     if(pos==std::string::npos){
    //         //这里就返回一个空字符串
    //         return "";
    //     }
    //     int size=atoi(buffer.substr(0,pos).c_str());
    //     int surplus=buffer.size()-SEP_LEN*2-pos;
    //     if(surplus >= size){
    //         buffer.erase(0,pos+SEP_LEN);
    //         std::string s=buffer.substr(0,size);
    //         return s;
    //     }
    //     else{
    //         return "";
    //     }
    // }
    // std::string DeCode2(std::string& buffer)
    // {
    //     std::size_t pos=buffer.find(SEP);
    //     if(pos==std::string::npos){
    //         return "";
    //     }
    //     int size=atoi(buffer.substr(0,pos).c_str());
    //     int surplus=buffer.size()-pos-2*SEP_LEN;
    //     if(surplus >= size){
    //         buffer.erase(0,pos+SEP_LEN);
    //         std::string s=buffer.substr(0,size);
    //         buffer.erase(0,size+SEP_LEN);
    //         return s;
    //     }
    //     else{
    //         return "";
    //     }
    // }
    std::string DeCode2(std::string& buffer)
    {
        std::size_t pos=buffer.find(SEP);
        if(pos==std::string::npos){
            return "";
        }
        int size=atoi(buffer.substr(0,pos).c_str());
        int surplus=buffer.size()-SEP_LEN*2-pos;
        if(surplus >= size){
            buffer.erase(0,pos);
            std::string s=buffer.substr(0,size);
            return s;
        }
        else{
            return "";
        }
    }
    std::string DeCode(std::string& buffer)
    {
        std::size_t pos=buffer.find(SEP);
        if(pos==std::string::npos){
            return "";
        }
        int size=atoi(buffer.substr(0,pos).c_str());
        int surplus=buffer.size()-pos-2*SEP_LEN;
        if(surplus >= size){
            buffer.erase(0,pos+SEP_LEN);
            std::string s=buffer.substr(0,size);
            buffer.erase(0,size+SEP_LEN);
            return s;
        }
        else{
            return "";
        }
    }
}
